/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Bdd;
import Metier.Divorce;
import java.util.ArrayList;
import java.sql.*;
/**
 *
 * @author p0925231
 */
public class DivorceRepository extends Repository {

    private VipRepository vipRepo;
    
    public DivorceRepository() {
        vipRepo = new VipRepository();
    }
    public ArrayList loadAll() {
        System.out.println("Tentative de chargement de tous les Divorce");
        ArrayList<Divorce> list = new ArrayList<Divorce>();
        try {
            openConnection();           
            ResultSet ensresul = stmt.executeQuery("SELECT Divorce.id,Vip_id,Vip_id2,date FROM Divorce,Date where Date.id=Divorce.Dat_id");
            ensresul.last();
            int nbObject = ensresul.getRow();
            ensresul.first();
            if(nbObject>0) {
                System.out.println("Chargement des "+nbObject+" Divorce trouvés...");
                ResultSet vip1Info = null;
                ResultSet vip2Info = null;
                do {
                    System.out.println("Chargement des vip Divorce "+ensresul.getInt(1));
                    stmtPr = dataBaseConnection.prepareStatement("select * from ViewVip where id=?");
                    stmtPr.setInt(1, ensresul.getInt(2));
                    vip1Info = stmtPr.executeQuery();
                    stmtPr = dataBaseConnection.prepareStatement("select * from ViewVip where id=?");
                    stmtPr.setInt(1, ensresul.getInt(3));
                    vip2Info = stmtPr.executeQuery();
                    if (!vip1Info.first() || !vip2Info.first()) {
                        System.out.println("Erreur : le Divorce contient des Vip inexistant");
                        vip1Info.close();
                        vip2Info.close();
                        ensresul.close();
                        closeConnection();
                        return null;
                    }
                    System.out.println("Création des deux Vip à partir du Divorce...");
                    Metier.Vip vip2 = new Metier.Vip(vip2Info.getInt(1), vip2Info.getString(2), vip2Info.getString(3), vip2Info.getString(4), vip2Info.getString(5), vip2Info.getDate(6), vip2Info.getString(7), vip2Info.getString(8), vip2Info.getBoolean(9), vip2Info.getBoolean(10));
                    Metier.Vip vip1 = new Metier.Vip(vip1Info.getInt(1), vip1Info.getString(2), vip1Info.getString(3), vip1Info.getString(4), vip1Info.getString(5), vip1Info.getDate(6), vip1Info.getString(7), vip1Info.getString(8), vip1Info.getBoolean(9), vip1Info.getBoolean(10));
                    vip1Info.close();
                    vip2Info.close();
                    stmtPr.close();
                    list.add(new Divorce(
                            ensresul.getInt(1), // id
                            vip1,
                            vip2,
                            ensresul.getDate(4)));
                } while (ensresul.next());
                ensresul.close();
                closeConnection();
            }
            else {
                System.out.println("Aucun Divorce trouvé...");
                ensresul.close();
                closeConnection();
                return new ArrayList<Divorce>();
            }
        } catch (SQLException e) {
            closeConnection();
            System.err.println("Erreur recupération donnée" + e);
        }
        System.out.println("Fin chargement Divorce");
        return list;
    }

    public Object loadById(int id) {
        System.out.println("Tentative de recupération de Divorce avec l'id " + id);
        ResultSet result = null;
        Metier.Divorce objResult;
        try {
            openConnection();
            result = stmt.executeQuery("SELECT * FROM ViewDivorce where id='"+id+"'");
            Metier.Vip vip1 = vipRepo.loadById(result.getInt(2));
            Metier.Vip vip2 = vipRepo.loadById(result.getInt(3));
            if(vip1==null || vip2==null)
                return null;
            objResult = new Metier.Divorce(
                                            result.getInt(1), // id
                                            vip1,
                                            vip2,
                                            result.getDate(4)
                                            );
            closeConnection();
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return null;
        }
        System.out.println("Recupération Divorce ok (" + objResult + ")");
        return objResult;
    }

    public int isObjectExist(Object obj) {
        if (obj.getClass() != Divorce.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Divorce");
            return -1;
        }
        Divorce objDivorce = (Divorce) obj;
        ResultSet result = null;
        int nbObject = 0, idObject = -1;
        System.out.println("Recherche existance de Divorce entre " + objDivorce.getVip1() + " et " + objDivorce.getVip2());
        try {
            openConnection();
            result = stmt.executeQuery("select Divorce.id from Divorce,Date where ((Vip_id='"+objDivorce.getVip1().getId()+"' AND Vip_id2='"+objDivorce.getVip2().getId()+"') OR (Vip_id='"+objDivorce.getVip2().getId()+"' AND Vip_id2='"+objDivorce.getVip1().getId()+"')) AND date='"+objDivorce.getDate()+"' AND Divorce.Dat_id=Date.id");
            result.last();
            nbObject = result.getRow();
            result.first();
            if(nbObject!=0) {
                if (nbObject > 1) {
                    System.out.println("WARNING ! Plusieurs Divorce existe avec la même valeur");
                } else {
                    System.out.println("Divorce unique trouvée");
                }
                idObject = result.getInt(1);
                result.close();
                closeConnection();
                return idObject;
            }
            
        } catch (java.sql.SQLException e) {
            // Alerte probleme requete //
            System.err.println("Probleme execution requete " + e);
            closeConnection();
            return -1;
        }
        closeConnection();
        return -1;
    }

    public boolean isIdExist(int id) {
        ResultSet result = null;
        ArrayList<Integer> fina = new ArrayList<Integer>();
        System.out.println("Recherche existance de Divorce avec id=" + id);
        try {
            openConnection();
            result = stmt.executeQuery("select count(id) from Divorce where id='" + id + "'");
            System.out.println("Verification existance Divorce id=" + id);
            int count;
            while (result.next()) {
                count = result.getInt(1);
                fina.add(count);
            }
            result.close();
            closeConnection();
        } catch (java.sql.SQLException e) {
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return false;
        }
        // Si il existe un nombre de resultat different de 1 //
        if (fina.size() != 1) {
            // Erreur SQL plusieurs Divorce avec le même id //
            System.out.println("ERROR ! Plusieurs Divorce existe avec cet id");
            return true;
        }
        if (fina.get(0) != 0) {
            System.out.println("Divorce unique trouvée");
            return true;
        }
        return false;
    }

    public int insertObject(Object obj) {
        if (obj.getClass() != Divorce.class) {
            System.out.println("ERREUR ! L'objet envoyé à isObjectExist n'est pas un Divorce");
            return -1;
        }
        Divorce objDivorce = (Divorce) obj;

        System.out.println("Tentative insertion de " + objDivorce.toString());
        // Recherche de l'existance d'un objet Divorce //
        if (isObjectExist(obj) != -1) {
            System.out.println("L'objet \"" + objDivorce.toString() + "\" existe déjà");
            return INSERT_ERROR_EXIST;
        } else {
            System.out.println("Aucun divorce n'existe");
        }
        ////////////////////////////////////////////////////////////
        // L'objet n'est pas déjà présent, insertion d'un nouveau //
        ////////////////////////////////////////////////////////////

        // GESTION DE LA DATE //
        
        DateRepository dateRepo = new DateRepository();
        // On créer une nouvelle date (uniquement si inexistante, cf DateRepository) //
        if (dateRepo.insertObject(objDivorce.getDate())) {
            System.out.println("Insertion date ok");
        } else {
            System.out.println("Probleme insertion date");
            return -1;
        }
        // On récupère l'id de cette date //
        int idDate = dateRepo.isObjectExist(objDivorce.getDate());
        
        // GESTION DU VIP //
        
        VipRepository vipRepo = new VipRepository();
        // On récupère l'id de vip1 //
        int idVip1 = vipRepo.isObjectExist(objDivorce.getVip1());
        // On récupère l'id de vip2 //
        int idVip2 = vipRepo.isObjectExist(objDivorce.getVip2());
        // Verification des id //
        if (idVip1 == (-1) || idVip2 == (-1)) {
            return INSERT_ERROR_VIP;
        }

        try {
            openConnection();
            String query = "insert into Divorce (Vip_id,Vip_id2,Dat_id) values('" + idVip1 + "','" + idVip2 + "','" + idDate + "')";
            stmt.executeUpdate(query);
            System.out.println("Insertion Divorce OK");
            // Mise a jour des statuts des 2 vip //
            System.out.println("Mise a jour des status des Vip...");
            query = "update Vip set celib='1' where id='"+idVip1+"'";
            stmt.executeUpdate(query);
            query = "update Vip set celib='1' where id='"+idVip2+"'";
            stmt.executeUpdate(query);
            closeConnection();
            return INSERT_OK;
        } catch (Exception e) {
            /* Alerte probleme requete */
            closeConnection();
            System.err.println("Probleme execution requete " + e);
            return INSERT_ERROR_NET;
        }
    }
    public void deleteObject(Divorce objDivorce) {
        if(isObjectExist(objDivorce)!=-1) {
            try {
                openConnection();
                String query = "delete from Divorce where id='"+objDivorce.getId()+"'";
                stmt.executeUpdate(query);
                System.out.println("Suppression Divorce OK");
                closeConnection();
            } catch (Exception e) {
                /* Alerte probleme requete */
                closeConnection();
                System.err.println("Probleme execution requete " + e);
            }
        }
        else {
            System.err.println("Aucun divorce trouvé dans la BD");
        }
    }
}
